{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 特征工程"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>instant</th>\n",
       "      <th>dteday</th>\n",
       "      <th>season</th>\n",
       "      <th>yr</th>\n",
       "      <th>mnth</th>\n",
       "      <th>holiday</th>\n",
       "      <th>weekday</th>\n",
       "      <th>workingday</th>\n",
       "      <th>weathersit</th>\n",
       "      <th>temp</th>\n",
       "      <th>atemp</th>\n",
       "      <th>hum</th>\n",
       "      <th>windspeed</th>\n",
       "      <th>casual</th>\n",
       "      <th>registered</th>\n",
       "      <th>cnt</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>2011-01-01</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>6</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>0.344167</td>\n",
       "      <td>0.363625</td>\n",
       "      <td>0.805833</td>\n",
       "      <td>0.160446</td>\n",
       "      <td>331</td>\n",
       "      <td>654</td>\n",
       "      <td>985</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>2011-01-02</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>0.363478</td>\n",
       "      <td>0.353739</td>\n",
       "      <td>0.696087</td>\n",
       "      <td>0.248539</td>\n",
       "      <td>131</td>\n",
       "      <td>670</td>\n",
       "      <td>801</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>2011-01-03</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0.196364</td>\n",
       "      <td>0.189405</td>\n",
       "      <td>0.437273</td>\n",
       "      <td>0.248309</td>\n",
       "      <td>120</td>\n",
       "      <td>1229</td>\n",
       "      <td>1349</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>2011-01-04</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0.200000</td>\n",
       "      <td>0.212122</td>\n",
       "      <td>0.590435</td>\n",
       "      <td>0.160296</td>\n",
       "      <td>108</td>\n",
       "      <td>1454</td>\n",
       "      <td>1562</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>2011-01-05</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0.226957</td>\n",
       "      <td>0.229270</td>\n",
       "      <td>0.436957</td>\n",
       "      <td>0.186900</td>\n",
       "      <td>82</td>\n",
       "      <td>1518</td>\n",
       "      <td>1600</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   instant      dteday  season  yr  mnth  holiday  weekday  workingday  \\\n",
       "0        1  2011-01-01       1   0     1        0        6           0   \n",
       "1        2  2011-01-02       1   0     1        0        0           0   \n",
       "2        3  2011-01-03       1   0     1        0        1           1   \n",
       "3        4  2011-01-04       1   0     1        0        2           1   \n",
       "4        5  2011-01-05       1   0     1        0        3           1   \n",
       "\n",
       "   weathersit      temp     atemp       hum  windspeed  casual  registered  \\\n",
       "0           2  0.344167  0.363625  0.805833   0.160446     331         654   \n",
       "1           2  0.363478  0.353739  0.696087   0.248539     131         670   \n",
       "2           1  0.196364  0.189405  0.437273   0.248309     120        1229   \n",
       "3           1  0.200000  0.212122  0.590435   0.160296     108        1454   \n",
       "4           1  0.226957  0.229270  0.436957   0.186900      82        1518   \n",
       "\n",
       "    cnt  \n",
       "0   985  \n",
       "1   801  \n",
       "2  1349  \n",
       "3  1562  \n",
       "4  1600  "
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "\n",
    "train = pd.read_csv(\"D:\\\\python\\\\sharebike\\\\day.csv\")\n",
    "train.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 731 entries, 0 to 730\n",
      "Data columns (total 16 columns):\n",
      "instant       731 non-null int64\n",
      "dteday        731 non-null object\n",
      "season        731 non-null int64\n",
      "yr            731 non-null int64\n",
      "mnth          731 non-null int64\n",
      "holiday       731 non-null int64\n",
      "weekday       731 non-null int64\n",
      "workingday    731 non-null int64\n",
      "weathersit    731 non-null int64\n",
      "temp          731 non-null float64\n",
      "atemp         731 non-null float64\n",
      "hum           731 non-null float64\n",
      "windspeed     731 non-null float64\n",
      "casual        731 non-null int64\n",
      "registered    731 non-null int64\n",
      "cnt           731 non-null int64\n",
      "dtypes: float64(4), int64(11), object(1)\n",
      "memory usage: 91.5+ KB\n"
     ]
    }
   ],
   "source": [
    "train.info()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 类别型特征编码"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 对类别型特征进行独热编码"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>season_1</th>\n",
       "      <th>season_2</th>\n",
       "      <th>season_3</th>\n",
       "      <th>season_4</th>\n",
       "      <th>mnth_1</th>\n",
       "      <th>mnth_2</th>\n",
       "      <th>mnth_3</th>\n",
       "      <th>mnth_4</th>\n",
       "      <th>mnth_5</th>\n",
       "      <th>mnth_6</th>\n",
       "      <th>...</th>\n",
       "      <th>weathersit_1</th>\n",
       "      <th>weathersit_2</th>\n",
       "      <th>weathersit_3</th>\n",
       "      <th>weekday_0</th>\n",
       "      <th>weekday_1</th>\n",
       "      <th>weekday_2</th>\n",
       "      <th>weekday_3</th>\n",
       "      <th>weekday_4</th>\n",
       "      <th>weekday_5</th>\n",
       "      <th>weekday_6</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 26 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   season_1  season_2  season_3  season_4  mnth_1  mnth_2  mnth_3  mnth_4  \\\n",
       "0         1         0         0         0       1       0       0       0   \n",
       "1         1         0         0         0       1       0       0       0   \n",
       "2         1         0         0         0       1       0       0       0   \n",
       "3         1         0         0         0       1       0       0       0   \n",
       "4         1         0         0         0       1       0       0       0   \n",
       "\n",
       "   mnth_5  mnth_6  ...  weathersit_1  weathersit_2  weathersit_3  weekday_0  \\\n",
       "0       0       0  ...             0             1             0          0   \n",
       "1       0       0  ...             0             1             0          1   \n",
       "2       0       0  ...             1             0             0          0   \n",
       "3       0       0  ...             1             0             0          0   \n",
       "4       0       0  ...             1             0             0          0   \n",
       "\n",
       "   weekday_1  weekday_2  weekday_3  weekday_4  weekday_5  weekday_6  \n",
       "0          0          0          0          0          0          1  \n",
       "1          0          0          0          0          0          0  \n",
       "2          1          0          0          0          0          0  \n",
       "3          0          1          0          0          0          0  \n",
       "4          0          0          1          0          0          0  \n",
       "\n",
       "[5 rows x 26 columns]"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#对类别型特征，观察其取值范围及直方图\n",
    "categorical_features = ['season', 'mnth', 'weathersit', 'weekday']\n",
    "\n",
    "#数据类型变为object，才能被get_dummies处理（即进行独热编码）\n",
    "for col in categorical_features:\n",
    "    train[col] = train[col].astype('object')\n",
    "\n",
    "X_train_cat = train[categorical_features]\n",
    "X_train_cat = pd.get_dummies(X_train_cat)\n",
    "X_train_cat.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 数值型特征标准化"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 对数值型特征进行标准化/MinMaxScaler 去量纲"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>temp</th>\n",
       "      <th>atemp</th>\n",
       "      <th>hum</th>\n",
       "      <th>windspeed</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.355170</td>\n",
       "      <td>0.373517</td>\n",
       "      <td>0.828620</td>\n",
       "      <td>0.284606</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.379232</td>\n",
       "      <td>0.360541</td>\n",
       "      <td>0.715771</td>\n",
       "      <td>0.466215</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0.171000</td>\n",
       "      <td>0.144830</td>\n",
       "      <td>0.449638</td>\n",
       "      <td>0.465740</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0.175530</td>\n",
       "      <td>0.174649</td>\n",
       "      <td>0.607131</td>\n",
       "      <td>0.284297</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0.209120</td>\n",
       "      <td>0.197158</td>\n",
       "      <td>0.449313</td>\n",
       "      <td>0.339143</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       temp     atemp       hum  windspeed\n",
       "0  0.355170  0.373517  0.828620   0.284606\n",
       "1  0.379232  0.360541  0.715771   0.466215\n",
       "2  0.171000  0.144830  0.449638   0.465740\n",
       "3  0.175530  0.174649  0.607131   0.284297\n",
       "4  0.209120  0.197158  0.449313   0.339143"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#数值型变量预处理\n",
    "from sklearn.preprocessing import MinMaxScaler\n",
    "\n",
    "#实例化\n",
    "mn_X = MinMaxScaler()\n",
    "numerical_features = ['temp', 'atemp', 'hum', 'windspeed']\n",
    "temp = mn_X.fit_transform(train[numerical_features])\n",
    "\n",
    "X_train_num = pd.DataFrame(data=temp, columns=numerical_features, index=train.index)\n",
    "X_train_num.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>season_1</th>\n",
       "      <th>season_2</th>\n",
       "      <th>season_3</th>\n",
       "      <th>season_4</th>\n",
       "      <th>mnth_1</th>\n",
       "      <th>mnth_2</th>\n",
       "      <th>mnth_3</th>\n",
       "      <th>mnth_4</th>\n",
       "      <th>mnth_5</th>\n",
       "      <th>mnth_6</th>\n",
       "      <th>...</th>\n",
       "      <th>weekday_3</th>\n",
       "      <th>weekday_4</th>\n",
       "      <th>weekday_5</th>\n",
       "      <th>weekday_6</th>\n",
       "      <th>temp</th>\n",
       "      <th>atemp</th>\n",
       "      <th>hum</th>\n",
       "      <th>windspeed</th>\n",
       "      <th>holiday</th>\n",
       "      <th>weekday</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0.355170</td>\n",
       "      <td>0.373517</td>\n",
       "      <td>0.828620</td>\n",
       "      <td>0.284606</td>\n",
       "      <td>0</td>\n",
       "      <td>6</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.379232</td>\n",
       "      <td>0.360541</td>\n",
       "      <td>0.715771</td>\n",
       "      <td>0.466215</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.171000</td>\n",
       "      <td>0.144830</td>\n",
       "      <td>0.449638</td>\n",
       "      <td>0.465740</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.175530</td>\n",
       "      <td>0.174649</td>\n",
       "      <td>0.607131</td>\n",
       "      <td>0.284297</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.209120</td>\n",
       "      <td>0.197158</td>\n",
       "      <td>0.449313</td>\n",
       "      <td>0.339143</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 32 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   season_1  season_2  season_3  season_4  mnth_1  mnth_2  mnth_3  mnth_4  \\\n",
       "0         1         0         0         0       1       0       0       0   \n",
       "1         1         0         0         0       1       0       0       0   \n",
       "2         1         0         0         0       1       0       0       0   \n",
       "3         1         0         0         0       1       0       0       0   \n",
       "4         1         0         0         0       1       0       0       0   \n",
       "\n",
       "   mnth_5  mnth_6  ...  weekday_3  weekday_4  weekday_5  weekday_6      temp  \\\n",
       "0       0       0  ...          0          0          0          1  0.355170   \n",
       "1       0       0  ...          0          0          0          0  0.379232   \n",
       "2       0       0  ...          0          0          0          0  0.171000   \n",
       "3       0       0  ...          0          0          0          0  0.175530   \n",
       "4       0       0  ...          1          0          0          0  0.209120   \n",
       "\n",
       "      atemp       hum  windspeed  holiday  weekday  \n",
       "0  0.373517  0.828620   0.284606        0        6  \n",
       "1  0.360541  0.715771   0.466215        0        0  \n",
       "2  0.144830  0.449638   0.465740        0        1  \n",
       "3  0.174649  0.607131   0.284297        0        2  \n",
       "4  0.197158  0.449313   0.339143        0        3  \n",
       "\n",
       "[5 rows x 32 columns]"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#将类别型特征和数值型特征连接在一起\n",
    "X_train = pd.concat([X_train_cat, X_train_num, train['holiday'], train['weekday']], axis=1, ignore_index=False)\n",
    "X_train.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>instant</th>\n",
       "      <th>season_1</th>\n",
       "      <th>season_2</th>\n",
       "      <th>season_3</th>\n",
       "      <th>season_4</th>\n",
       "      <th>mnth_1</th>\n",
       "      <th>mnth_2</th>\n",
       "      <th>mnth_3</th>\n",
       "      <th>mnth_4</th>\n",
       "      <th>mnth_5</th>\n",
       "      <th>...</th>\n",
       "      <th>weekday_5</th>\n",
       "      <th>weekday_6</th>\n",
       "      <th>temp</th>\n",
       "      <th>atemp</th>\n",
       "      <th>hum</th>\n",
       "      <th>windspeed</th>\n",
       "      <th>holiday</th>\n",
       "      <th>weekday</th>\n",
       "      <th>yr</th>\n",
       "      <th>cnt</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0.355170</td>\n",
       "      <td>0.373517</td>\n",
       "      <td>0.828620</td>\n",
       "      <td>0.284606</td>\n",
       "      <td>0</td>\n",
       "      <td>6</td>\n",
       "      <td>0</td>\n",
       "      <td>985</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.379232</td>\n",
       "      <td>0.360541</td>\n",
       "      <td>0.715771</td>\n",
       "      <td>0.466215</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>801</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.171000</td>\n",
       "      <td>0.144830</td>\n",
       "      <td>0.449638</td>\n",
       "      <td>0.465740</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1349</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.175530</td>\n",
       "      <td>0.174649</td>\n",
       "      <td>0.607131</td>\n",
       "      <td>0.284297</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>1562</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.209120</td>\n",
       "      <td>0.197158</td>\n",
       "      <td>0.449313</td>\n",
       "      <td>0.339143</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>1600</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 35 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   instant  season_1  season_2  season_3  season_4  mnth_1  mnth_2  mnth_3  \\\n",
       "0        1         1         0         0         0       1       0       0   \n",
       "1        2         1         0         0         0       1       0       0   \n",
       "2        3         1         0         0         0       1       0       0   \n",
       "3        4         1         0         0         0       1       0       0   \n",
       "4        5         1         0         0         0       1       0       0   \n",
       "\n",
       "   mnth_4  mnth_5  ...  weekday_5  weekday_6      temp     atemp       hum  \\\n",
       "0       0       0  ...          0          1  0.355170  0.373517  0.828620   \n",
       "1       0       0  ...          0          0  0.379232  0.360541  0.715771   \n",
       "2       0       0  ...          0          0  0.171000  0.144830  0.449638   \n",
       "3       0       0  ...          0          0  0.175530  0.174649  0.607131   \n",
       "4       0       0  ...          0          0  0.209120  0.197158  0.449313   \n",
       "\n",
       "   windspeed  holiday  weekday  yr   cnt  \n",
       "0   0.284606        0        6   0   985  \n",
       "1   0.466215        0        0   0   801  \n",
       "2   0.465740        0        1   0  1349  \n",
       "3   0.284297        0        2   0  1562  \n",
       "4   0.339143        0        3   0  1600  \n",
       "\n",
       "[5 rows x 35 columns]"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "FE_train = pd.concat([train['instant'], X_train, train['yr'], train['cnt']], axis=1)\n",
    "FE_train.to_csv('F:\\CSDN\\AI\\课程资料\\FE_day.csv', index=False)\n",
    "FE_train.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 731 entries, 0 to 730\n",
      "Data columns (total 35 columns):\n",
      "instant         731 non-null int64\n",
      "season_1        731 non-null uint8\n",
      "season_2        731 non-null uint8\n",
      "season_3        731 non-null uint8\n",
      "season_4        731 non-null uint8\n",
      "mnth_1          731 non-null uint8\n",
      "mnth_2          731 non-null uint8\n",
      "mnth_3          731 non-null uint8\n",
      "mnth_4          731 non-null uint8\n",
      "mnth_5          731 non-null uint8\n",
      "mnth_6          731 non-null uint8\n",
      "mnth_7          731 non-null uint8\n",
      "mnth_8          731 non-null uint8\n",
      "mnth_9          731 non-null uint8\n",
      "mnth_10         731 non-null uint8\n",
      "mnth_11         731 non-null uint8\n",
      "mnth_12         731 non-null uint8\n",
      "weathersit_1    731 non-null uint8\n",
      "weathersit_2    731 non-null uint8\n",
      "weathersit_3    731 non-null uint8\n",
      "weekday_0       731 non-null uint8\n",
      "weekday_1       731 non-null uint8\n",
      "weekday_2       731 non-null uint8\n",
      "weekday_3       731 non-null uint8\n",
      "weekday_4       731 non-null uint8\n",
      "weekday_5       731 non-null uint8\n",
      "weekday_6       731 non-null uint8\n",
      "temp            731 non-null float64\n",
      "atemp           731 non-null float64\n",
      "hum             731 non-null float64\n",
      "windspeed       731 non-null float64\n",
      "holiday         731 non-null int64\n",
      "weekday         731 non-null object\n",
      "yr              731 non-null int64\n",
      "cnt             731 non-null int64\n",
      "dtypes: float64(4), int64(4), object(1), uint8(26)\n",
      "memory usage: 70.0+ KB\n"
     ]
    }
   ],
   "source": [
    "FE_train.info()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 回归分析"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 导入基本工具包及特征数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "import pandas as plt\n",
    "import numpy as np\n",
    "#模型\n",
    "from sklearn.linear_model import LinearRegression, RidgeCV, LassoCV, ElasticNetCV\n",
    "\n",
    "#模型评估\n",
    "from sklearn.metrics import mean_squared_error\n",
    "from sklearn.metrics import r2_score #评价回归预测模型的性能\n",
    "\n",
    "#可视化\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>instant</th>\n",
       "      <th>season_1</th>\n",
       "      <th>season_2</th>\n",
       "      <th>season_3</th>\n",
       "      <th>season_4</th>\n",
       "      <th>mnth_1</th>\n",
       "      <th>mnth_2</th>\n",
       "      <th>mnth_3</th>\n",
       "      <th>mnth_4</th>\n",
       "      <th>mnth_5</th>\n",
       "      <th>...</th>\n",
       "      <th>weekday_5</th>\n",
       "      <th>weekday_6</th>\n",
       "      <th>temp</th>\n",
       "      <th>atemp</th>\n",
       "      <th>hum</th>\n",
       "      <th>windspeed</th>\n",
       "      <th>holiday</th>\n",
       "      <th>weekday</th>\n",
       "      <th>yr</th>\n",
       "      <th>cnt</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0.355170</td>\n",
       "      <td>0.373517</td>\n",
       "      <td>0.828620</td>\n",
       "      <td>0.284606</td>\n",
       "      <td>0</td>\n",
       "      <td>6</td>\n",
       "      <td>0</td>\n",
       "      <td>985</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.379232</td>\n",
       "      <td>0.360541</td>\n",
       "      <td>0.715771</td>\n",
       "      <td>0.466215</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>801</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.171000</td>\n",
       "      <td>0.144830</td>\n",
       "      <td>0.449638</td>\n",
       "      <td>0.465740</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1349</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.175530</td>\n",
       "      <td>0.174649</td>\n",
       "      <td>0.607131</td>\n",
       "      <td>0.284297</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>1562</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.209120</td>\n",
       "      <td>0.197158</td>\n",
       "      <td>0.449313</td>\n",
       "      <td>0.339143</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>1600</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 35 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   instant  season_1  season_2  season_3  season_4  mnth_1  mnth_2  mnth_3  \\\n",
       "0        1         1         0         0         0       1       0       0   \n",
       "1        2         1         0         0         0       1       0       0   \n",
       "2        3         1         0         0         0       1       0       0   \n",
       "3        4         1         0         0         0       1       0       0   \n",
       "4        5         1         0         0         0       1       0       0   \n",
       "\n",
       "   mnth_4  mnth_5  ...  weekday_5  weekday_6      temp     atemp       hum  \\\n",
       "0       0       0  ...          0          1  0.355170  0.373517  0.828620   \n",
       "1       0       0  ...          0          0  0.379232  0.360541  0.715771   \n",
       "2       0       0  ...          0          0  0.171000  0.144830  0.449638   \n",
       "3       0       0  ...          0          0  0.175530  0.174649  0.607131   \n",
       "4       0       0  ...          0          0  0.209120  0.197158  0.449313   \n",
       "\n",
       "   windspeed  holiday  weekday  yr   cnt  \n",
       "0   0.284606        0        6   0   985  \n",
       "1   0.466215        0        0   0   801  \n",
       "2   0.465740        0        1   0  1349  \n",
       "3   0.284297        0        2   0  1562  \n",
       "4   0.339143        0        3   0  1600  \n",
       "\n",
       "[5 rows x 35 columns]"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#读入数据\n",
    "data = pd.read_csv(\"F:\\CSDN\\AI\\课程资料\\FE_day.csv\")\n",
    "data.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 准备训练数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "y = data['cnt']\n",
    "X = data.drop(['cnt'], axis=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "train samples: (584, 34)\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "d:\\python\\lib\\site-packages\\sklearn\\model_selection\\_split.py:2179: FutureWarning: From version 0.21, test_size will always complement train_size unless both are specified.\n",
      "  FutureWarning)\n"
     ]
    }
   ],
   "source": [
    "#用train_test_split分隔训练数据和测试数据\n",
    "from sklearn.model_selection import train_test_split\n",
    "X_train, X_test, y_train, y_test = train_test_split(X, y, train_size = 0.8, random_state=0)\n",
    "\n",
    "print('train samples:', X_train.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "d:\\python\\lib\\site-packages\\pandas\\core\\frame.py:3940: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame\n",
      "\n",
      "See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy\n",
      "  errors=errors)\n"
     ]
    }
   ],
   "source": [
    "#保存测试ID，用于结果提交\n",
    "testID = X_test['instant']\n",
    "\n",
    "#ID不参与预测\n",
    "X_train.drop(['instant'], axis=1, inplace=True)\n",
    "X_test.drop(['instant'], axis=1, inplace=True)\n",
    "\n",
    "#保存特征名称以备后续使用\n",
    "feat_names = X_train.columns"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 模型训练"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Linear Regression without regularization 最小二乘线性回归 没有正则项\n",
    "最小二乘没有超参数调优 直接用全体训练数据训练模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "RMSE on Training set: 752.2641169543664\n",
      "RMSE on Test set: 785.6091150510081\n",
      "r2_score on Training set: 0.8436740400232239\n",
      "r2_score on Test set: 0.854888089345905\n"
     ]
    }
   ],
   "source": [
    "# Linear Regression\n",
    "# 1.生成学习器实例\n",
    "lr = LinearRegression()\n",
    "\n",
    "# 2.在训练集上训练学习器\n",
    "lr.fit(X_train, y_train)\n",
    "\n",
    "# 3.用训练好的学习器对训练集/测试集进行预测\n",
    "y_train_pred = lr.predict(X_train)\n",
    "y_test_pred = lr.predict(X_test)\n",
    "\n",
    "rmse_train = np.sqrt(mean_squared_error(y_train, y_train_pred))\n",
    "rmse_test = np.sqrt(mean_squared_error(y_test, y_test_pred))\n",
    "print('RMSE on Training set:', rmse_train)\n",
    "print('RMSE on Test set:', rmse_test)\n",
    "\n",
    "r2_score_train = r2_score(y_train, y_train_pred)\n",
    "r2_score_test = r2_score(y_test, y_test_pred)\n",
    "print('r2_score on Training set:', r2_score_train)\n",
    "print('r2_score on Test set:', r2_score_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Rdige picked 33 features and eliminated the other 0 features\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#Plot import coefficients\n",
    "coefs = pd.Series(lr.coef_, index=feat_names)\n",
    "print('Rdige picked ' + str(sum(coefs !=0)) + ' features and eliminated the other ' + \\\n",
    "      str(sum(coefs == 0)) + ' features')\n",
    "\n",
    "#正系数值最大的10个特征和负系数值最小(绝对值大)的10个特征\n",
    "imp_coefs = pd.concat([coefs.sort_values().head(10), \n",
    "                       coefs.sort_values().tail(10)])\n",
    "imp_coefs.plot(kind = 'barh')\n",
    "plt.title('Coefficients in the OLS Model')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "season_1        -804.648046\n",
       "season_2          45.685001\n",
       "season_3          58.091083\n",
       "season_4         700.871963\n",
       "mnth_1          -281.064635\n",
       "mnth_2          -186.423635\n",
       "mnth_3           238.550050\n",
       "mnth_4            32.669321\n",
       "mnth_5           427.121249\n",
       "mnth_6             4.085997\n",
       "mnth_7          -429.258837\n",
       "mnth_8            48.766840\n",
       "mnth_9           664.025366\n",
       "mnth_10          215.197270\n",
       "mnth_11         -405.007739\n",
       "mnth_12         -328.661246\n",
       "weathersit_1     718.862651\n",
       "weathersit_2     361.719092\n",
       "weathersit_3   -1080.581743\n",
       "weekday_0        -83.945467\n",
       "weekday_1         14.593556\n",
       "weekday_2         48.905824\n",
       "weekday_3         33.118210\n",
       "weekday_4         37.270798\n",
       "weekday_5          1.252078\n",
       "weekday_6        -51.194999\n",
       "temp            2815.801467\n",
       "atemp           1075.711228\n",
       "hum            -1884.936243\n",
       "windspeed      -1512.255103\n",
       "holiday         -378.804644\n",
       "weekday           59.933424\n",
       "yr              1938.700434\n",
       "dtype: float64"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "coefs"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Linear Regression with Ridge regularization(L2 penalty)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Best aplha: 1.0\n",
      "cv of rmse: [ 804.98918461  801.05701102  797.90396785  822.10470674 1076.41238794\n",
      " 1678.83081678]\n",
      "RMSE on Training set:  754.0446032378647\n",
      "RMSE on Test set:  777.3278516384781\n",
      "r2_score on Training set:  0.84293316827511\n",
      "r2_score on Test set:  0.8579312725283771\n"
     ]
    }
   ],
   "source": [
    "# RidgeCV 缺省的score是mean square errors\n",
    "# 1.设置超参数搜索范围，生成学习器实例\n",
    "# RidgeCV(alpha(0.01, 0.1, 1, 10, 100, 1000), fit_intervept=True, normalize=False, scoring=None, cv=None, gcv_mode=None, store_cv_values=False)\n",
    "alphas = [0.01, 0.1, 1, 10, 100, 1000]\n",
    "ridge = RidgeCV(alphas=alphas, store_cv_values=True)\n",
    "\n",
    "# 2.用训练数据对模型进行训练\n",
    "# RidgeCV采用的是广义交叉验证(Generalized Cross-Validation),留一交叉验证（N-折交叉验证）的一种有效实现方式\n",
    "ridge.fit(X_train, y_train)\n",
    "\n",
    "#通过交叉验证得到的最佳超参数alpha\n",
    "alpha = ridge.alpha_\n",
    "print('Best aplha:',alpha)\n",
    "\n",
    "# 交叉验证估计的测试误差\n",
    "mse_cv = np.mean(ridge.cv_values_, axis=0)\n",
    "rmse_cv = np.sqrt(mse_cv)\n",
    "print('cv of rmse:', rmse_cv)\n",
    "\n",
    "#训练集上测试，训练误差，实际任务中这一步不需要\n",
    "y_train_pred = ridge.predict(X_train)\n",
    "rmse_train = np.sqrt(mean_squared_error(y_train, y_train_pred))\n",
    "\n",
    "y_test_pred = ridge.predict(X_test)\n",
    "rmse_test = np.sqrt(mean_squared_error(y_test, y_test_pred))\n",
    "\n",
    "print('RMSE on Training set: ', rmse_train)\n",
    "print('RMSE on Test set: ', rmse_test)\n",
    "\n",
    "r2_score_train = r2_score(y_train, y_train_pred)\n",
    "r2_score_test = r2_score(y_test, y_test_pred)\n",
    "print('r2_score on Training set: ', r2_score_train)\n",
    "print('r2_score on Test set: ', r2_score_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Rdige picked 33 features and eliminated the other 0 features\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Plot important coefficients\n",
    "coefs = pd.Series(ridge.coef_, index=feat_names)\n",
    "print('Rdige picked ' + str(sum(coefs != 0)) + ' features and eliminated the other '+ \\\n",
    "     str(sum(coefs == 0)) + ' features')\n",
    "\n",
    "#正系数值最大的10个特征和负系数值最小的10个特征\n",
    "imp_coefs = pd.concat([coefs.sort_values().head(10),\n",
    "                      coefs.sort_values().tail(10)])\n",
    "imp_coefs.plot(kind = 'barh')\n",
    "plt.title('Coefficients in the Ridge Model')\n",
    "plt.show()\n",
    "\n",
    "mse_mean = np.mean(ridge.cv_values_, axis = 0)\n",
    "plt.plot(np.log10(alphas), mse_mean.reshape(len(alphas), 1))\n",
    "\n",
    "plt.xlabel('log(alpha)')\n",
    "plt.ylabel('mse')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "season_1        -817.095588\n",
       "season_2          61.259747\n",
       "season_3          97.115093\n",
       "season_4         658.720748\n",
       "mnth_1          -384.531433\n",
       "mnth_2          -254.982884\n",
       "mnth_3           185.773456\n",
       "mnth_4            -5.890906\n",
       "mnth_5           437.870274\n",
       "mnth_6           104.568279\n",
       "mnth_7          -307.785069\n",
       "mnth_8           129.742599\n",
       "mnth_9           670.518603\n",
       "mnth_10          235.102996\n",
       "mnth_11         -429.174459\n",
       "mnth_12         -381.211455\n",
       "weathersit_1     757.004151\n",
       "weathersit_2     341.593903\n",
       "weathersit_3   -1098.598054\n",
       "weekday_0        -85.953280\n",
       "weekday_1          6.323986\n",
       "weekday_2         54.454395\n",
       "weekday_3         36.470279\n",
       "weekday_4         44.326741\n",
       "weekday_5          6.329000\n",
       "weekday_6        -61.951122\n",
       "temp            1890.986517\n",
       "atemp           1606.509782\n",
       "hum            -1520.311538\n",
       "windspeed      -1336.587593\n",
       "holiday         -337.195057\n",
       "weekday           61.888845\n",
       "yr              1952.480141\n",
       "dtype: float64"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "coefs"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "相比于OLS，岭回归模型增加了L2正则，系数值进行了收缩。由于增加正则限制了模型复杂度，相比OLS模型，岭回归模型在训练集上的误差略有增加，但在测试集上的误差有所减小"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Linear Regression with Lasso regularization(L1 penalty)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "d:\\python\\lib\\site-packages\\sklearn\\model_selection\\_split.py:2053: FutureWarning: You should specify a value for 'cv' instead of relying on the default value. The default value will change from 3 to 5 in version 0.22.\n",
      "  warnings.warn(CV_WARNING, FutureWarning)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Best alpha:  2.505302145721889\n",
      "cv of rmse:  828.1648696311936\n",
      "Lasso picked 26 features and eliminated the other 7 features\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "RMSE on Training set:  754.5767421210094\n",
      "RMSE on Test set:  787.2255564031217\n",
      "r2_score on Training set:  0.8427114019226359\n",
      "r2_score on Test set:  0.8542903207998064\n"
     ]
    }
   ],
   "source": [
    "# Lasso\n",
    "# 1.生成机器学习器实例，LassCV默认参数可自动确定aplha的搜索范围\n",
    "lasso = LassoCV()\n",
    "\n",
    "# 2.模型训练\n",
    "lasso.fit(X_train, y_train)\n",
    "alpha = lasso.alpha_\n",
    "print('Best alpha: ', alpha)\n",
    "\n",
    "# 3.模型性能：cv\n",
    "mse_cv = np.mean(lasso.mse_path_, axis = 1)\n",
    "rmse_cv = np.sqrt(mse_cv)\n",
    "print(\"cv of rmse: \", min(rmse_cv))\n",
    "\n",
    "# 4.特征重要性\n",
    "coefs = pd.Series(lasso.coef_, index=feat_names)\n",
    "print('Lasso picked ' + str(sum(coefs != 0)) + ' features and eliminated the other ' + \\\n",
    "     str(sum(coefs == 0)) + ' features')\n",
    "imp_coefs = pd.concat([coefs.sort_values().head(10),\n",
    "                     coefs.sort_values().tail(10)])\n",
    "imp_coefs.plot(kind='barh')\n",
    "plt.title('Coefficients int Lasso Model')\n",
    "plt.show()\n",
    "\n",
    "# 5.显示不同alpha对应的模型性能\n",
    "plt.plot(np.log10(lasso.alphas_), mse_cv)\n",
    "plt.xlabel('log(alpha)')\n",
    "plt.ylabel('mse')\n",
    "plt.show()\n",
    "\n",
    "#训练误差\n",
    "y_train_pred = lasso.predict(X_train)\n",
    "rmse_train = np.sqrt(mean_squared_error(y_train, y_train_pred))\n",
    "print('RMSE on Training set: ', rmse_train)\n",
    "\n",
    "#测试误差\n",
    "y_test_pred = lasso.predict(X_test)\n",
    "rmse_test = np.sqrt(mean_squared_error(y_test, y_test_pred))\n",
    "print('RMSE on Test set: ', rmse_test)\n",
    "\n",
    "r2_score_train = r2_score(y_train, y_train_pred)\n",
    "r2_score_test = r2_score(y_test, y_test_pred)\n",
    "print('r2_score on Training set: ', r2_score_train)\n",
    "print('r2_score on Test set: ', r2_score_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "season_1       -1001.109652\n",
       "season_2          -0.000000\n",
       "season_3           0.000000\n",
       "season_4         440.571540\n",
       "mnth_1          -137.344355\n",
       "mnth_2           -28.496460\n",
       "mnth_3           277.771008\n",
       "mnth_4            -0.000000\n",
       "mnth_5           362.395794\n",
       "mnth_6             0.000000\n",
       "mnth_7          -392.108796\n",
       "mnth_8             7.570982\n",
       "mnth_9           636.943013\n",
       "mnth_10          355.995698\n",
       "mnth_11         -200.682197\n",
       "mnth_12         -146.016094\n",
       "weathersit_1     391.702639\n",
       "weathersit_2      -0.000000\n",
       "weathersit_3   -1412.464685\n",
       "weekday_0        -75.086254\n",
       "weekday_1         -0.000000\n",
       "weekday_2         23.778345\n",
       "weekday_3          1.407161\n",
       "weekday_4          6.056773\n",
       "weekday_5         -0.000000\n",
       "weekday_6        -42.718790\n",
       "temp            2948.711700\n",
       "atemp            889.888237\n",
       "hum            -1597.621397\n",
       "windspeed      -1371.988807\n",
       "holiday         -294.982150\n",
       "weekday           59.542865\n",
       "yr              1943.026323\n",
       "dtype: float64"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "coefs"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Lasso 模型增加了L1正则，系数值进行了收缩，同时有些特征的系数为0.在这个例子中，岭回归模型比Lasso模型性能稍好"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 对测试集进行测试，生成提交文件"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [],
   "source": [
    "y_test_pred = ridge.predict(X_test)\n",
    "\n",
    "#生成提交测试结果\n",
    "df = pd.DataFrame({\"instant\":testID, 'cnt':y_test_pred})\n",
    "df.to_csv('F:\\CSDN\\AI\\课程资料\\submission.csv')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "Int64Index: 147 entries, 196 to 239\n",
      "Data columns (total 2 columns):\n",
      "instant    147 non-null int64\n",
      "cnt        147 non-null float64\n",
      "dtypes: float64(1), int64(1)\n",
      "memory usage: 3.4 KB\n"
     ]
    }
   ],
   "source": [
    "df.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>instant</th>\n",
       "      <th>cnt</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>196</th>\n",
       "      <td>197</td>\n",
       "      <td>4448.081392</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>187</th>\n",
       "      <td>188</td>\n",
       "      <td>4714.152691</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>15</td>\n",
       "      <td>1424.456629</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>31</th>\n",
       "      <td>32</td>\n",
       "      <td>1068.701798</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>390</th>\n",
       "      <td>391</td>\n",
       "      <td>3651.942132</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>319</th>\n",
       "      <td>320</td>\n",
       "      <td>1668.411474</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>299</th>\n",
       "      <td>300</td>\n",
       "      <td>3899.844153</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>702</th>\n",
       "      <td>703</td>\n",
       "      <td>5771.873293</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>462</th>\n",
       "      <td>463</td>\n",
       "      <td>5966.032674</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>27</th>\n",
       "      <td>28</td>\n",
       "      <td>943.658047</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>40</th>\n",
       "      <td>41</td>\n",
       "      <td>1454.047008</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>360</th>\n",
       "      <td>361</td>\n",
       "      <td>1183.982731</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>55</th>\n",
       "      <td>56</td>\n",
       "      <td>1231.674546</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>157</th>\n",
       "      <td>158</td>\n",
       "      <td>4816.202339</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>193</th>\n",
       "      <td>194</td>\n",
       "      <td>4708.515012</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>170</th>\n",
       "      <td>171</td>\n",
       "      <td>3849.346986</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>618</th>\n",
       "      <td>619</td>\n",
       "      <td>6729.322848</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>679</th>\n",
       "      <td>680</td>\n",
       "      <td>5944.798768</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>382</th>\n",
       "      <td>383</td>\n",
       "      <td>3304.476179</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>79</th>\n",
       "      <td>80</td>\n",
       "      <td>2703.660537</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>607</th>\n",
       "      <td>608</td>\n",
       "      <td>7251.441160</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>728</th>\n",
       "      <td>729</td>\n",
       "      <td>3110.524740</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>674</th>\n",
       "      <td>675</td>\n",
       "      <td>5102.288625</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>162</th>\n",
       "      <td>163</td>\n",
       "      <td>4322.349341</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>386</th>\n",
       "      <td>387</td>\n",
       "      <td>2053.722354</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>596</th>\n",
       "      <td>597</td>\n",
       "      <td>5972.220478</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>202</th>\n",
       "      <td>203</td>\n",
       "      <td>5477.194543</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>242</th>\n",
       "      <td>243</td>\n",
       "      <td>4994.701575</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>631</th>\n",
       "      <td>632</td>\n",
       "      <td>7065.625613</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>518</th>\n",
       "      <td>519</td>\n",
       "      <td>6497.830903</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>122</th>\n",
       "      <td>123</td>\n",
       "      <td>3782.559459</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>663</th>\n",
       "      <td>664</td>\n",
       "      <td>6415.767793</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>457</th>\n",
       "      <td>458</td>\n",
       "      <td>5225.531678</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>37</th>\n",
       "      <td>38</td>\n",
       "      <td>1871.302184</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>172</th>\n",
       "      <td>173</td>\n",
       "      <td>4908.234284</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>48</th>\n",
       "      <td>49</td>\n",
       "      <td>2888.900362</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>365</th>\n",
       "      <td>366</td>\n",
       "      <td>3590.783963</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>318</th>\n",
       "      <td>319</td>\n",
       "      <td>3558.812282</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>268</th>\n",
       "      <td>269</td>\n",
       "      <td>4996.634329</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>18</th>\n",
       "      <td>19</td>\n",
       "      <td>1063.335090</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>521</th>\n",
       "      <td>522</td>\n",
       "      <td>5602.222220</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>415</th>\n",
       "      <td>416</td>\n",
       "      <td>3296.642618</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>76</th>\n",
       "      <td>77</td>\n",
       "      <td>3484.605711</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>64</th>\n",
       "      <td>65</td>\n",
       "      <td>972.574307</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>582</th>\n",
       "      <td>583</td>\n",
       "      <td>6501.185220</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>52</th>\n",
       "      <td>53</td>\n",
       "      <td>1359.444816</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>293</th>\n",
       "      <td>294</td>\n",
       "      <td>4476.585303</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>389</th>\n",
       "      <td>390</td>\n",
       "      <td>3711.698079</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>443</th>\n",
       "      <td>444</td>\n",
       "      <td>5084.678385</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>470</th>\n",
       "      <td>471</td>\n",
       "      <td>6021.233629</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>261</th>\n",
       "      <td>262</td>\n",
       "      <td>4208.645011</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>279</th>\n",
       "      <td>280</td>\n",
       "      <td>5219.726713</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>252</th>\n",
       "      <td>253</td>\n",
       "      <td>5186.662347</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>483</th>\n",
       "      <td>484</td>\n",
       "      <td>5335.972099</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>118</th>\n",
       "      <td>119</td>\n",
       "      <td>4119.891654</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>566</th>\n",
       "      <td>567</td>\n",
       "      <td>5482.352755</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>688</th>\n",
       "      <td>689</td>\n",
       "      <td>4776.158840</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>266</th>\n",
       "      <td>267</td>\n",
       "      <td>5152.623131</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>504</th>\n",
       "      <td>505</td>\n",
       "      <td>7299.642413</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>239</th>\n",
       "      <td>240</td>\n",
       "      <td>4329.696349</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>147 rows × 2 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "     instant          cnt\n",
       "196      197  4448.081392\n",
       "187      188  4714.152691\n",
       "14        15  1424.456629\n",
       "31        32  1068.701798\n",
       "390      391  3651.942132\n",
       "319      320  1668.411474\n",
       "299      300  3899.844153\n",
       "702      703  5771.873293\n",
       "462      463  5966.032674\n",
       "27        28   943.658047\n",
       "40        41  1454.047008\n",
       "360      361  1183.982731\n",
       "55        56  1231.674546\n",
       "157      158  4816.202339\n",
       "193      194  4708.515012\n",
       "170      171  3849.346986\n",
       "618      619  6729.322848\n",
       "679      680  5944.798768\n",
       "382      383  3304.476179\n",
       "79        80  2703.660537\n",
       "607      608  7251.441160\n",
       "728      729  3110.524740\n",
       "674      675  5102.288625\n",
       "162      163  4322.349341\n",
       "386      387  2053.722354\n",
       "596      597  5972.220478\n",
       "202      203  5477.194543\n",
       "242      243  4994.701575\n",
       "631      632  7065.625613\n",
       "518      519  6497.830903\n",
       "..       ...          ...\n",
       "122      123  3782.559459\n",
       "663      664  6415.767793\n",
       "457      458  5225.531678\n",
       "37        38  1871.302184\n",
       "172      173  4908.234284\n",
       "48        49  2888.900362\n",
       "365      366  3590.783963\n",
       "318      319  3558.812282\n",
       "268      269  4996.634329\n",
       "18        19  1063.335090\n",
       "521      522  5602.222220\n",
       "415      416  3296.642618\n",
       "76        77  3484.605711\n",
       "64        65   972.574307\n",
       "582      583  6501.185220\n",
       "52        53  1359.444816\n",
       "293      294  4476.585303\n",
       "389      390  3711.698079\n",
       "443      444  5084.678385\n",
       "470      471  6021.233629\n",
       "261      262  4208.645011\n",
       "279      280  5219.726713\n",
       "252      253  5186.662347\n",
       "483      484  5335.972099\n",
       "118      119  4119.891654\n",
       "566      567  5482.352755\n",
       "688      689  4776.158840\n",
       "266      267  5152.623131\n",
       "504      505  7299.642413\n",
       "239      240  4329.696349\n",
       "\n",
       "[147 rows x 2 columns]"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
